<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <link href="stable/static/css/site.css" rel="stylesheet" type="text/css">
    <link href="stable/static/css/print.css" rel="stylesheet" type="text/css" media="print">
    <link href="stable/static/css/prettify.css" rel="stylesheet" type="text/css">
    <link href="//www.google.com/images/icons/product/chrome-16.png" rel="icon" type="image/ico">
    <link href="stable/static/css/api.css" rel="stylesheet" type="text/css">
    <title>chrome.webRequest - chrome插件中文开发文档(非官方)</title>
  </head>
  <body>
    <a id="top"></a>
    <div id="header">{Header content}</div>
    <a id="gc-topnav-anchor"></a>
    <div id="gc-topnav">
      <h1>Google Chrome Extensions</h1>
      <ul id="home" class="gc-topnav-tabs">
        <li id="home_link">
          <a href="index.html" title="Google Chrome Extensions home page"><div>Home</div></a>
        </li>
        <li id="docs_link">
          <a href="docs.html" title="Official Google Chrome Extensions documentation"><div>Docs</div></a>
        </li>
        <li id="faq_link">
          <a href="faq.html" title="Answers to frequently asked questions about Google Chrome Extensions"><div>FAQ</div></a>
        </li>
        <li id="samples_link">
          <a href="samples.html" title="Sample Extensions (with source code)"><div>Samples</div></a>
        </li>
        <li id="group_link">
          <a href="http://groups.google.com/a/chromium.org/group/chromium-extensions" title="Google Chrome Extensions developer forum"><div>Group</div></a>
        </li>
        <li id="so_link">
          <a href="http://stackoverflow.com/questions/tagged/google-chrome-extension" title="[google-chrome-extension] tag on Stack Overflow"><div>Questions?</div></a>
        </li>
      </ul>
    </div>
    <div id="gc-container">
      <div id="gc-sidebar">
        <ul 
            class="level1 ">
          <li class="level2">
                <a href="getstarted.html" class="level2 ">Getting Started</a>
          </li>
          <li class="level2">
                <a href="overview.html" class="level2 ">Overview</a>
          </li>
          <li class="level2">
                <a href="whats_new.html" class="level2 ">What's New?</a>
          </li>
          <li class="level2">
                <a href="devguide.html" class="level2 ">Developer's Guide</a>
              <ul 
                  class="level2 ">
                <li class="level3">
                    <a class="button level3">
                      <span class="level3">Browser UI</span>
                      <div class="toggleIndicator level3"></div>
                    </a>
                    <ul toggleable
                        class="level3 hidden">
                      <li class="level4">
                            <a href="browserAction.html" class="level4 ">Browser Actions</a>
                      </li>
                      <li class="level4">
                            <a href="contextMenus.html" class="level4 ">Context Menus</a>
                      </li>
                      <li class="level4">
                            <a href="notifications.html" class="level4 ">Desktop Notifications</a>
                      </li>
                      <li class="level4">
                            <a href="omnibox.html" class="level4 ">Omnibox</a>
                      </li>
                      <li class="level4">
                            <a href="options.html" class="level4 ">Options Pages</a>
                      </li>
                      <li class="level4">
                            <a href="override.html" class="level4 ">Override Pages</a>
                      </li>
                      <li class="level4">
                            <a href="pageAction.html" class="level4 ">Page Actions</a>
                      </li>
                    </ul>
                </li>
                <li class="level3">
                    <a class="button level3">
                      <span class="level3">Browser Interaction</span>
                      <div class="toggleIndicator level3"></div>
                    </a>
                    <ul toggleable
                        class="level3 hidden">
                      <li class="level4">
                            <a href="bookmarks.html" class="level4 ">Bookmarks</a>
                      </li>
                      <li class="level4">
                            <a href="cookies.html" class="level4 ">Cookies</a>
                      </li>
                      <li class="level4">
                            <a href="devtools.html" class="level4 ">Developer Tools</a>
                      </li>
                      <li class="level4">
                            <a href="events.html" class="level4 ">Events</a>
                      </li>
                      <li class="level4">
                            <a href="history.html" class="level4 ">History</a>
                      </li>
                      <li class="level4">
                            <a href="management.html" class="level4 ">Management</a>
                      </li>
                      <li class="level4">
                            <a href="tabs.html" class="level4 ">Tabs</a>
                      </li>
                      <li class="level4">
                            <a href="windows.html" class="level4 ">Windows</a>
                      </li>
                    </ul>
                </li>
                <li class="level3">
                    <a class="button level3">
                      <span class="level3">Implementation</span>
                      <div class="toggleIndicator level3"></div>
                    </a>
                    <ul toggleable
                        class="level3 hidden">
                      <li class="level4">
                            <a href="a11y.html" class="level4 ">Accessibility</a>
                      </li>
                      <li class="level4">
                            <a href="event_pages.html" class="level4 ">Event Pages</a>
                      </li>
                      <li class="level4">
                            <a href="contentSecurityPolicy.html" class="level4 ">Content Security Policy</a>
                      </li>
                      <li class="level4">
                            <a href="content_scripts.html" class="level4 ">Content Scripts</a>
                      </li>
                      <li class="level4">
                            <a href="xhr.html" class="level4 ">Cross-Origin XHR</a>
                      </li>
                      <li class="level4">
                            <a href="i18n.html" class="level4 ">Internationalization</a>
                      </li>
                      <li class="level4">
                            <a href="messaging.html" class="level4 ">Message Passing</a>
                      </li>
                      <li class="level4">
                            <a href="permissions.html" class="level4 ">Optional Permissions</a>
                      </li>
                      <li class="level4">
                            <a href="npapi.html" class="level4 ">NPAPI Plugins</a>
                      </li>
                    </ul>
                </li>
                <li class="level3">
                    <a class="button level3">
                      <span class="level3">Finishing</span>
                      <div class="toggleIndicator level3"></div>
                    </a>
                    <ul toggleable
                        class="level3 hidden">
                      <li class="level4">
                            <a href="hosting.html" class="level4 ">Hosting</a>
                      </li>
                      <li class="level4">
                            <a href="external_extensions.html" class="level4 ">Other Deployment Options</a>
                      </li>
                    </ul>
                </li>
              </ul>
          </li>
          <li class="level2">
                <a href="tutorials.html" class="level2 ">Tutorials</a>
              <ul 
                  class="level2 ">
                <li class="level3">
                      <a href="tut_migration_to_manifest_v2.html" class="level3 ">Manifest V2</a>
                </li>
                <li class="level3">
                      <a href="tut_debugging.html" class="level3 ">Debugging</a>
                </li>
                <li class="level3">
                      <a href="tut_analytics.html" class="level3 ">Google Analytics</a>
                </li>
                <li class="level3">
                      <a href="tut_oauth.html" class="level3 ">OAuth</a>
                </li>
              </ul>
          </li>
          <li class="level2">
                <span class="level2">Reference</span>
              <ul 
                  class="level2 ">
                <li class="level3">
                    <a class="button level3">
                      <span class="level3">Formats</span>
                      <div class="toggleIndicator level3"></div>
                    </a>
                    <ul toggleable
                        class="level3 hidden">
                      <li class="level4">
                            <a href="manifest.html" class="level4 ">Manifest Files</a>
                      </li>
                      <li class="level4">
                            <a href="match_patterns.html" class="level4 ">Match Patterns</a>
                      </li>
                    </ul>
                </li>
                <li class="level3">
                      <a href="permission_warnings.html" class="level3 ">Permission Warnings</a>
                </li>
                <li class="level3">
                      <a href="api_index.html" class="level3 ">chrome.* APIs</a>
                </li>
                <li class="level3">
                      <a href="api_other.html" class="level3 ">Other APIs</a>
                </li>
              </ul>
          </li>
          <li class="level2">
                <span class="level2">More</span>
              <ul 
                  class="level2 ">
                <li class="level3">
                      <a href="http://code.google.com/chrome/webstore/docs/index.html" class="level3 ">Chrome Web Store</a>
                </li>
                <li class="level3">
                      <a href="http://code.google.com/chrome/apps/docs/developers_guide.html" class="level3 ">Hosted Apps</a>
                </li>
                <li class="level3">
                      <a href="themes.html" class="level3 ">Themes</a>
                </li>
              </ul>
          </li>
        </ul>
      </div>
      <div id="gc-pagecontent">
        <h1 class="page_title">chrome.webRequest</h1>
        
        
        
        <div id="toc">
          <h2>Contents</h2>
          <ol>
            <li>
              <a href=#manifest>Manifest</a>
            </li>
            <li>
              <a href=#life_cycle>Life cycle of requests</a>
            </li>
            <li>
              <a href=#concepts>Concepts</a>
              <ol>
                <li><a href=#Request IDs>Request IDs</a></li><li><a href=#subscription>Registering event listeners</a></li>
              </ol>
            </li>
            <li>
              <a href=#implementation>Implementation details</a>
              <ol>
                <li><a href=#conflict_resolution>Conflict resolution</a></li><li><a href=#caching>Caching</a></li><li><a href=#timestamps>Timestamps</a></li>
              </ol>
            </li>
            <li>
              <a href=#examples>Examples</a>
            </li>
            <li>
              <a href="#apiReference">API reference: chrome.webRequest</a>
              <ol>
                  <li><a href="#types">Types</a><ol>  <li>    <a href="#type-RequestFilter">RequestFilter</a>  </li>  <li>    <a href="#type-HttpHeaders">HttpHeaders</a>  </li>  <li>    <a href="#type-BlockingResponse">BlockingResponse</a>  </li>  <li>    <a href="#type-UploadData">UploadData</a>  </li></ol></li>
                  <li><a href="#properties">Properties</a><ol>  <li>    <a href="#property-MAX_HANDLER_BEHAVIOR_CHANGED_CALLS_PER_10_MINUTES">MAX_HANDLER_BEHAVIOR_CHANGED_CALLS_PER_10_MINUTES</a>  </li></ol></li>
                  <li><a href="#methods">Methods</a><ol>  <li><a href="#method-handlerBehaviorChanged">handlerBehaviorChanged</a></li></ol></li>
                  <li><a href="#events">Events</a><ol>  <li><a href="#event-onBeforeRequest">onBeforeRequest</a></li>  <li><a href="#event-onBeforeSendHeaders">onBeforeSendHeaders</a></li>  <li><a href="#event-onSendHeaders">onSendHeaders</a></li>  <li><a href="#event-onHeadersReceived">onHeadersReceived</a></li>  <li><a href="#event-onAuthRequired">onAuthRequired</a></li>  <li><a href="#event-onResponseStarted">onResponseStarted</a></li>  <li><a href="#event-onBeforeRedirect">onBeforeRedirect</a></li>  <li><a href="#event-onCompleted">onCompleted</a></li>  <li><a href="#event-onErrorOccurred">onErrorOccurred</a></li></ol></li>
                  <li><a href="#samples">Sample Extensions</a></li>
              </ol>
            </li>
          </ol>
        </div>

<p id="classSummary">
Use the <code>chrome.webRequest</code> module to intercept, block,
or modify requests in-flight and to observe and analyze traffic.
</p>

<h2 id="manifest">Manifest</h2>
<p>You must declare the "webRequest" permission in the <a
  href="manifest.html">extension manifest</a> to use the web request
API, along with <a href="manifest.html#permissions">host permissions</a>
for any hosts whose network requests you want to access. If you want to
use the web request API in a blocking fashion, you need to request
the "webRequestBlocking" permission in addition.
For example:</p>
<pre>{
  "name": "My extension",
  ...
  <b>"permissions": [
    "webRequest",
    "*://*.google.com"
  ]</b>,
  ...
}</pre>

<h2 id="life_cycle">Life cycle of requests</h2>

<p>
The web request API defines a set of events that follow the life cycle of a web
request. You can use these events to observe and analyze traffic. Certain
synchronous events will allow you to intercept, block, or modify a request.
</p>

<p>
The event life cycle for successful requests is illustrated here, followed by
event definitions:<br/>
<img src="stable/static/images/webrequestapi.png"
  width="385" height="503"
  alt="Life cycle of a web request from the perspective of the webrequest API"
  style="margin-left: auto; margin-right: auto; display: block"/>
</p>

<p>
<dl>
  <dt><code>onBeforeRequest</code> (optionally synchronous)</dt>
  <dd>Fires when a request is about to occur. This event is sent before any TCP
  connection is made and can be used to cancel or redirect requests.</dd>
  <dt><code>onBeforeSendHeaders</code> (optionally synchronous)</dt>
  <dd>Fires when a request is about to occur and the initial headers have been
  prepared. The event is intended to allow extensions to add, modify, and delete
  request headers <a href="#life_cycle_footnote">(*)</a>. The
  <code>onBeforeSendHeaders</code> event is passed to all subscribers, so
  different subscribers may attempt to modify the request; see the <a
    href="#implementation">Implementation details</a> section for how this is
  handled. This event can be used to cancel the request.</dd>
  <dt><code>onSendHeaders</code></dt>
  <dd>Fires after all extensions have had a chance to modify the request
  headers, and presents the final <a href="#life_cycle_footnote">(*)</a>
  version. The event is triggered before the headers are sent to the network.
  This event is informational and handled asynchronously. It does not allow
  modifying or cancelling the request.</dd>
  <dt><code>onHeadersReceived</code> (optionally synchronous)</dt>
  <dd>Fires each time that an HTTP(S) response header is received. Due
  to redirects and authentication requests this can happen multiple times per
  request. This event is intended to allow extensions to add, modify, and delete
  response headers, such as incoming Set-Cookie headers.</dd>
  <dt><code>onAuthRequired</code> (optionally synchronous)</dt>
  <dd>Fires when a request requires authentication of the user. This event can
  be handled synchronously to provide authentication credentials. Note that
  extensions may provide invalid credentials. Take care not to enter an infinite
  loop by repeatedly providing invalid credentials.</dd>
  <dt><code>onBeforeRedirect</code></dt>
  <dd>Fires when a redirect is about to be executed. A redirection can be
  triggered by an HTTP response code or by an extension. This event is
  informational and handled asynchronously. It does not allow you to modify or
  cancel the request. </dd>
  <dt><code>onResponseStarted</code></dt>
  <dd>Fires when the first byte of the response body is received. For HTTP
  requests, this means that the status line and response headers are
  available. This event is informational and handled asynchronously. It does not
  allow modifying or cancelling the request.</dd>
  <dt><code>onCompleted</code></dt>
  <dd>Fires when a request has been processed successfully.</dd>
  <dt><code>onErrorOccurred</code></dt>
  <dd>Fires when a request could not be processed successfully.</dd>
</dl>
The web request API guarantees that for each request either
<code>onCompleted</code> or <code>onErrorOccurred</code> is fired as the final
event with one exception: If a request is redirected to a <code>data://</code>
URL, <code>onBeforeRedirect</code> is the last reported event.
</p>

<p id="life_cycle_footnote">(*) Note that the web request API presents an
abstraction of the network stack to the extension. Internally, one URL request
can be split into several HTTP requests (for example to fetch individual byte
ranges from a large file) or can be handled by the network stack without
communicating with the network. For this reason, the API does not provide the
final HTTP headers that are sent to the network. For example, all headers that
are related to caching are invisible to the extension.</p>

<p>The following headers are currently <b>not provided</b> to the
<code>onBeforeSendHeaders</code> event. This list is not guaranteed to be
complete nor stable.
<ul>
  <li>Authorization</li>
  <li>Cache-Control</li>
  <li>Connection</li>
  <li>Content-Length</li>
  <li>Host</li>
  <li>If-Modified-Since</li>
  <li>If-None-Match</li>
  <li>If-Range</li>
  <li>Partial-Data</li>
  <li>Pragma</li>
  <li>Proxy-Authorization</li>
  <li>Proxy-Connection</li>
  <li>Transfer-Encoding</li>
</ul>
</p>

<p>
The webRequest API only exposes requests that the extension has
permission to see, given its
<a href="manifest.html#permissions">host permissions</a>.
Moreover, only the following schemes are accessible:
<code>http://</code>,
<code>https://</code>,
<code>ftp://</code>,
<code>file://</code>, or
<code>chrome-extension://</code>.
In addition, even certain requests with URLs using one of the above schemes
are hidden, e.g.,
<code>chrome-extension://other_extension_id</code> where
<code>other_extension_id</code> is not the ID of the extension to handle
the request,
<code>https://www.google.com/chrome</code>,
and others (this list is not complete). Also synchronous XMLHttpRequests from
your extension are hidden from blocking event handlers in order to prevent
deadlocks.
</p>

<h2 id="concepts">Concepts</h2>

<p>As the following sections explain, events in the web request API use request
IDs, and you can optionally specify filters and extra information when you
register event listeners.</p>

<h3 id="Request IDs">Request IDs</h3>

<p>Each request is identified by a request ID. This ID is unique within a
browser session and the context of an extension. It remains constant during the
the life cycle of a request and can be used to match events for the same
request. Note that several HTTP requests are mapped to one web request in case
of HTTP redirection or HTTP authentication.</p>

<h3 id="subscription">Registering event listeners</h3>

<p>To register an event listener for a web request, you use a variation on the
<a href="events.html">usual <code>addListener()</code> function</a>.
In addition to specifying a callback function,
you have to specify a filter argument and you may specify an optional extra info
argument.</p>

<p>The three arguments to the web request API's <code>addListener()</code> have
the following definitions:</p>
<pre>
var callback = function(details) {...};
var filter = {...};
var opt_extraInfoSpec = [...];
</pre>

<p>Here's an example of listening for the <code>onBeforeRequest</code>
event:</p>
<pre>
chrome.webRequest.onBeforeRequest.addListener(
  callback, filter, opt_extraInfoSpec);
</pre>

<p>Each <code>addListener()</code> call takes a mandatory callback function as
the first parameter. This callback function is passed a dictionary containing
information about the current URL request. The information in this dictionary
depends on the specific event type as well as the content of
<code>opt_extraInfoSpec</code>.</p>

<p>If the optional <code>opt_extraInfoSpec</code> array contains the string
<code>'blocking'</code> (only allowed for specific events), the callback
function is handled synchronously. That means that the request is blocked until
the callback function returns. In this case, the callback can return a <a
  href="#type-BlockingResponse">BlockingResponse</a> that determines the further
life cycle of the request. Depending on the context, this response allows
cancelling or redirecting a request (<code>onBeforeRequest</code>), cancelling a
request or modifying headers (<code>onBeforeSendHeaders</code>,
<code>onHeadersReceived</code>), or providing authentication credentials
(<code>onAuthRequired</code>).</p>

<p>The <a href="#type-RequestFilter">RequestFilter</a>
<code>filter</code> allows limiting the requests for which events are
triggered in various dimensions:
<dl>
  <dt>URLs</dt>
  <dd><a href="match_patterns.html">URL patterns</a> such as
  <code>*://www.google.com/foo*bar</code>.</dd>
  <dt>Types</dt>
  <dd>Request types such as <code>main_frame</code> (a document that is loaded
  for a top-level frame), <code>sub_frame</code> (a document that is loaded for
  an embedded frame), and <code>image</code> (an image on a web site).
  See <a href="#type-RequestFilter">RequestFilter</a>.</dd>
  <dt>Tab ID</dt>
  <dd>The identifier for one tab.</dd>
  <dt>Window ID</dt>
  <dd>The identifier for a window.</dd>
</p>

<p>Depending on the event type, you can specify strings in
<code>opt_extraInfoSpec</code> to ask for additional information about the
request. This is used to provide detailed information on request's data only
if explicitly requested.</p>

<h2 id="implementation">Implementation details</h2>

<p>Several implementation details can be important to understand when developing
an extension that uses the web request API:</p>

<h3 id="conflict_resolution">Conflict resolution</h3>
<p>In the current implementation of the web request API, a request is considered
as cancelled if at least one extension instructs to cancel the request. If
an extension cancels a request, all extensions are notified by an
<code>onErrorOccurred</code> event. Only one extension is allowed to redirect a
request or modify a header at a time. If more than one extension attempts to
modify the request, the most recently installed extension wins and all others
are ignored. An extension is not notified if its instruction to modify or
redirect has been ignored.</p>

<h3 id="caching">Caching</h3>
<p>
Chrome employs two caches &mdash; an on-disk cache and a very fast in-memory
cache.  The lifetime of an in-memory cache is attached to the lifetime of a
render process, which roughly corresponds to a tab. Requests that are answered
from the in-memory cache are invisible to the web request API. If a request
handler changes its behavior (for example, the behavior according to which
requests are blocked), a simple page refresh might not respect this changed
behavior.  To make sure the behavior change goes through, call
<code>handlerBehaviorChanged()</code> to flush the in-memory cache. But don't do
it often; flushing the cache is a very expensive operation. You don't need to
call <code>handlerBehaviorChanged()</code> after registering or unregistering an
event listener.</p>

<h3 id="timestamps">Timestamps</h3>
<p>
The <code>timestamp</code> property of web request events is only guaranteed to
be <i>internally</i> consistent. Comparing one event to another event will give
you the correct offset between them, but comparing them to the current time
inside the extension (via <code>(new Date()).getTime()</code>, for instance)
might give unexpected results.
</p>

<h2 id="examples">Examples</h2>

<p>The following example illustrates how to block all requests to
<code>www.evil.com</code>:</p>
<pre>
chrome.webRequest.onBeforeRequest.addListener(
  function(details) {
    return {cancel: details.url.indexOf("://www.evil.com/") != -1};
  },
  {urls: ["&lt;all_urls&gt;"]},
  ["blocking"]);
</pre>

<p>As this function uses a blocking event handler, it requires the "webRequest"
as well as the "webRequestBlocking" permission in the manifest file.</p>

<p>The following example achieves the same goal in a more efficient way because
requests that are not targeted to <code>www.evil.com</code> do not need to be
passed to the extension:</p>
<pre>
chrome.webRequest.onBeforeRequest.addListener(
  function(details) { return {cancel: true}; },
  {urls: ["*://www.evil.com/*"]},
  ["blocking"]);
</pre>

<p>The following example illustrates how to delete the User-Agent header from
all requests:</p>
<pre>
chrome.webRequest.onBeforeSendHeaders.addListener(
  function(details) {
    for (var i = 0; i < details.requestHeaders.length; ++i) {
      if (details.requestHeaders[i].name === 'User-Agent') {
        details.requestHeaders.splice(i, 1);
        break;
      }
    }
    return {requestHeaders: details.requestHeaders};
  },
  {urls: ["&lt;all_urls&gt;"]},
  ["blocking", "requestHeaders"]);
</pre>

<p> For more example code, see the <a href="samples.html#webrequest">web request
samples</a>.</p>
        <h2 id="apiReference">API Reference: chrome.webRequest</h2>
        <div class="api_reference">
            <h3 id="types">Types</h3>
              <div>
                <h3 id="type-RequestFilter">RequestFilter</h3>
                <div>
                  <dt><span class="type_name">  (    <span id="typeTemplate">object</span>  )</span></dt>
              <dd>
                    An object describing filters to apply to webRequest events.
                  </dd>    <h4 id="RequestFilter-properties">
                    Properties of <a href="#type-RequestFilter">RequestFilter</a>
                  </h4>
                  <dd><dl>      <div>
                      <a name="property-RequestFilter-urls"></a>
                      <dt>
                        <span class="variable">urls</span>
                        <span class="property">
                          (
                            
                            <span id="typeTemplate">array of string</span>
                          )
                        </span>
                      </dt>
                      <dd>
                        A list of URLs or URL patterns. Requests that cannot match any of the URLs will be filtered out.
                      </dd>
                    </div>
                    <div>
                      <a name="property-RequestFilter-types"></a>
                      <dt>
                        <span class="variable">types</span>
                        <span class="property">
                          (
                            <span class="optional">optional</span>
                            <span id="typeTemplate">array of enumerated string ["main_frame", "sub_frame", "stylesheet", "script", "image", "object", "xmlhttprequest", "other"]</span>
                          )
                        </span>
                      </dt>
                      <dd>
                        A list of request types. Requests that cannot match any of the types will be filtered out.
                      </dd>
                    </div>
                    <div>
                      <a name="property-RequestFilter-tabId"></a>
                      <dt>
                        <span class="variable">tabId</span>
                        <span class="property">
                          (
                            <span class="optional">optional</span>
                            <span id="typeTemplate">integer</span>
                          )
                        </span>
                      </dt>
                    </div>
                    <div>
                      <a name="property-RequestFilter-windowId"></a>
                      <dt>
                        <span class="variable">windowId</span>
                        <span class="property">
                          (
                            <span class="optional">optional</span>
                            <span id="typeTemplate">integer</span>
                          )
                        </span>
                      </dt>
                    </div>
              </dl></dd>
                </div>
              </div>
              <div>
                <h3 id="type-HttpHeaders">HttpHeaders</h3>
                <div>
                  <dt><span class="type_name">  (    <span id="typeTemplate">array of object</span>  )</span></dt>
              <dd>
                    An array of HTTP headers. Each header is represented as a dictionary containing the keys <code>name</code> and either <code>value</code> or <code>binaryValue</code>.
                  </dd>  </div>
              </div>
              <div>
                <h3 id="type-BlockingResponse">BlockingResponse</h3>
                <div>
                  <dt><span class="type_name">  (    <span id="typeTemplate">object</span>  )</span></dt>
              <dd>
                    Returns value for event handlers that have the 'blocking' extraInfoSpec applied. Allows the event handler to modify network requests.
                  </dd>    <h4 id="BlockingResponse-properties">
                    Properties of <a href="#type-BlockingResponse">BlockingResponse</a>
                  </h4>
                  <dd><dl>      <div>
                      <a name="property-BlockingResponse-cancel"></a>
                      <dt>
                        <span class="variable">cancel</span>
                        <span class="property">
                          (
                            <span class="optional">optional</span>
                            <span id="typeTemplate">boolean</span>
                          )
                        </span>
                      </dt>
                      <dd>
                        If true, the request is cancelled. Used in onBeforeRequest, this prevents the request from being sent.
                      </dd>
                    </div>
                    <div>
                      <a name="property-BlockingResponse-redirectUrl"></a>
                      <dt>
                        <span class="variable">redirectUrl</span>
                        <span class="property">
                          (
                            <span class="optional">optional</span>
                            <span id="typeTemplate">string</span>
                          )
                        </span>
                      </dt>
                      <dd>
                        Only used as a response to the onBeforeRequest event. If set, the original request is prevented from being sent and is instead redirected to the given URL.
                      </dd>
                    </div>
                    <div>
                      <a name="property-BlockingResponse-requestHeaders"></a>
                      <dt>
                        <span class="variable">requestHeaders</span>
                        <span class="property">
                          (
                            <span class="optional">optional</span>
                            <span id="typeTemplate"><a href="webRequest.html#type-HttpHeaders">HttpHeaders</a></span>
                          )
                        </span>
                      </dt>
                      <dd>
                        Only used as a response to the onBeforeSendHeaders event. If set, the request is made with these request headers instead.
                      </dd>
                    </div>
                    <div>
                      <a name="property-BlockingResponse-responseHeaders"></a>
                      <dt>
                        <span class="variable">responseHeaders</span>
                        <span class="property">
                          (
                            <span class="optional">optional</span>
                            <span id="typeTemplate"><a href="webRequest.html#type-HttpHeaders">HttpHeaders</a></span>
                          )
                        </span>
                      </dt>
                      <dd>
                        Only used as a response to the onHeadersReceived event. If set, the server is assumed to have responded with these response headers instead. Only return <code>responseHeaders</code> if you really want to modify the headers in order to limit the number of conflicts (only one extension may modify <code>responseHeaders</code> for each request).
                      </dd>
                    </div>
                    <div>
                      <a name="property-BlockingResponse-authCredentials"></a>
                      <dt>
                        <span class="variable">authCredentials</span>
                        <span class="property">
                          (
                            <span class="optional">optional</span>
                            <span id="typeTemplate">object</span>
                          )
                        </span>
                      </dt>
                      <dd>
                        Only used as a response to the onAuthRequired event. If set, the request is made using the supplied credentials.
                      </dd>
                      <dd>
                        <dl>
                          <div>
                            <a name="property-authCredentials-username"></a>
                            <dt>
                              <span class="variable">username</span>
                              <span class="property">
                                (
                                  
                                  <span id="typeTemplate">string</span>
                                )
                              </span>
                            </dt>
                          </div>
                          <div>
                            <a name="property-authCredentials-password"></a>
                            <dt>
                              <span class="variable">password</span>
                              <span class="property">
                                (
                                  
                                  <span id="typeTemplate">string</span>
                                )
                              </span>
                            </dt>
                          </div>
                        </dl>
                      </dd>
                    </div>
              </dl></dd>
                </div>
              </div>
              <div>
                <h3 id="type-UploadData">UploadData</h3>
                <div>
                  <dt><span class="type_name">  (    <span id="typeTemplate">object</span>  )</span></dt>
              <dd>
                    Contains data uploaded in a URL request.
                  </dd>    <h4 id="UploadData-properties">
                    Properties of <a href="#type-UploadData">UploadData</a>
                  </h4>
                  <dd><dl>      <div>
                      <a name="property-UploadData-bytes"></a>
                      <dt>
                        <span class="variable">bytes</span>
                        <span class="property">
                          (
                            <span class="optional">optional</span>
                            <span id="typeTemplate">any</span>
                          )
                        </span>
                      </dt>
                      <dd>
                        An ArrayBuffer with a copy of the data.
                      </dd>
                    </div>
                    <div>
                      <a name="property-UploadData-file"></a>
                      <dt>
                        <span class="variable">file</span>
                        <span class="property">
                          (
                            <span class="optional">optional</span>
                            <span id="typeTemplate">string</span>
                          )
                        </span>
                      </dt>
                      <dd>
                        A string with the file's path and name.
                      </dd>
                    </div>
              </dl></dd>
                </div>
              </div>
            <h3 id="properties">Properties</h3>
              <div>
                <h3 id="property-MAX_HANDLER_BEHAVIOR_CHANGED_CALLS_PER_10_MINUTES">MAX_HANDLER_BEHAVIOR_CHANGED_CALLS_PER_10_MINUTES</h3>
                <div class="summary">
                  <span>chrome.webRequest.MAX_HANDLER_BEHAVIOR_CHANGED_CALLS_PER_10_MINUTES</span>
                </div>
                <div>
                  <dt><span class="property">MAX_HANDLER_BEHAVIOR_CHANGED_CALLS_PER_10_MINUTES</span> <span class="type_name">  (    <span id="typeTemplate"><code>20</code></span>  )</span></dt>
              <dd>
                    The maximum number of times that <code>handlerBehaviorChanged</code> can be called per 10 minute sustained interval. <code>handlerBehaviorChanged</code> is an expensive function call that shouldn't be called often.
                  </dd>  </div>
              </div>
            <h3 id="methods">Methods</h3>
              <div>
                <h4 id="method-handlerBehaviorChanged">handlerBehaviorChanged</h4>
                <div class="summary lower">
                  <span>chrome.webRequest.handlerBehaviorChanged</span>()
                </div>
                <div class="description">
              <p>
                    Needs to be called when the behavior of the webRequest handlers has changed to prevent incorrect handling due to caching. This function call is expensive. Don't call it often.
                  </p>  </div>
              </div>
            <h3 id="events">Events</h3>
              <div>
                <h4 id="event-onBeforeRequest">onBeforeRequest</h4>
                <div class="summary">
                  <span class="subdued">chrome.webRequest.</span>onBeforeRequest<span class="subdued">.addListener</span>(function(<span>object <span class="variable">details</span></span>)<span class="subdued"> {...}</span>);
                </div>
                <div class="description">
              <p>
                    Fired when a request is about to occur.
                  </p>      <h4>Listener Parameters</h4>
                    <dl>
                      <div>  <a name="property-onBeforeRequest-details"></a>  <dt>    <span class="variable">details</span>    <span class="property">      (                <span id="typeTemplate">object</span>      )    </span>  </dt>  <dd>    <dl>      <div>        <a name="property-details-requestId"></a>        <dt>          <span class="variable">requestId</span>          <span class="property">            (                            <span id="typeTemplate">string</span>            )          </span>        </dt>        <dd>          The ID of the request. Request IDs are unique within a browser session. As a result, they could be used to relate different events of the same request.        </dd>      </div>      <div>        <a name="property-details-url"></a>        <dt>          <span class="variable">url</span>          <span class="property">            (                            <span id="typeTemplate">string</span>            )          </span>        </dt>      </div>      <div>        <a name="property-details-method"></a>        <dt>          <span class="variable">method</span>          <span class="property">            (                            <span id="typeTemplate">string</span>            )          </span>        </dt>        <dd>          Standard HTTP method.        </dd>      </div>      <div>        <a name="property-details-frameId"></a>        <dt>          <span class="variable">frameId</span>          <span class="property">            (                            <span id="typeTemplate">integer</span>            )          </span>        </dt>        <dd>          The value 0 indicates that the request happens in the main frame; a positive value indicates the ID of a subframe in which the request happens. If the document of a (sub-)frame is loaded (<code>type</code> is <code>main_frame</code> or <code>sub_frame</code>), <code>frameId</code> indicates the ID of this frame, not the ID of the outer frame. Frame IDs are unique within a tab.        </dd>      </div>      <div>        <a name="property-details-parentFrameId"></a>        <dt>          <span class="variable">parentFrameId</span>          <span class="property">            (                            <span id="typeTemplate">integer</span>            )          </span>        </dt>        <dd>          ID of frame that wraps the frame which sent the request. Set to -1 if no parent frame exists.        </dd>      </div>      <div>        <a name="property-details-requestBody"></a>        <dt>          <span class="variable">requestBody</span>          <span class="property">            (              <span class="optional">optional</span>              <span id="typeTemplate">object</span>            )          </span>        </dt>        <dd>          Experimental feature, only available in DEV or CANARY channels. Container for request body data. Only provided if extraInfoSpec contains 'requestBody'. Currently only request body elements containing byte data or files are reported.        </dd>        <dd>          <dl>            <div>              <a name="property-requestBody-error"></a>              <dt>                <span class="variable">error</span>                <span class="property">                  (                    <span class="optional">optional</span>                    <span id="typeTemplate">string</span>                  )                </span>              </dt>              <dd>                Errors when obtaining request body data.              </dd>            </div>            <div>              <a name="property-requestBody-formData"></a>              <dt>                <span class="variable">formData</span>                <span class="property">                  (                    <span class="optional">optional</span>                    <span id="typeTemplate">object</span>                  )                </span>              </dt>              <dd>                If the request method is POST and the body is a sequence of key-value pairs encoded in UTF8, encoded as either multipart/form-data, or application/x-www-form-urlencoded, this dictionary is present and for each key contains the list of all values for that key. If the data is of another media type, or if it is malformed, the dictionary is not present. An example value of this dictionary is {'key': ['value1', 'value2']}.              </dd>            </div>            <div>              <a name="property-requestBody-raw"></a>              <dt>                <span class="variable">raw</span>                <span class="property">                  (                    <span class="optional">optional</span>                    <span id="typeTemplate">array of <a href="webRequest.html#type-UploadData">UploadData</a></span>                  )                </span>              </dt>              <dd>                If the request method is PUT or POST, and the body is not already parsed in formData, then the unparsed request body elements are contained in this array.              </dd>            </div>          </dl>        </dd>      </div>      <div>        <a name="property-details-tabId"></a>        <dt>          <span class="variable">tabId</span>          <span class="property">            (                            <span id="typeTemplate">integer</span>            )          </span>        </dt>        <dd>          The ID of the tab in which the request takes place. Set to -1 if the request isn't related to a tab.        </dd>      </div>      <div>        <a name="property-details-type"></a>        <dt>          <span class="variable">type</span>          <span class="property">            (                            <span id="typeTemplate">enumerated string ["main_frame", "sub_frame", "stylesheet", "script", "image", "object", "xmlhttprequest", "other"]</span>            )          </span>        </dt>        <dd>          How the requested resource will be used.        </dd>      </div>      <div>        <a name="property-details-timeStamp"></a>        <dt>          <span class="variable">timeStamp</span>          <span class="property">            (                            <span id="typeTemplate">double</span>            )          </span>        </dt>        <dd>          The time when this signal is triggered, in milliseconds since the epoch.        </dd>      </div>    </dl>  </dd></div>
                    </dl>
                </div>
              </div>
              <div>
                <h4 id="event-onBeforeSendHeaders">onBeforeSendHeaders</h4>
                <div class="summary">
                  <span class="subdued">chrome.webRequest.</span>onBeforeSendHeaders<span class="subdued">.addListener</span>(function(<span>object <span class="variable">details</span></span>)<span class="subdued"> {...}</span>);
                </div>
                <div class="description">
              <p>
                    Fired before sending an HTTP request, once the request headers are available. This may occur after a TCP connection is made to the server, but before any HTTP data is sent. 
                  </p>      <h4>Listener Parameters</h4>
                    <dl>
                      <div>  <a name="property-onBeforeSendHeaders-details"></a>  <dt>    <span class="variable">details</span>    <span class="property">      (                <span id="typeTemplate">object</span>      )    </span>  </dt>  <dd>    <dl>      <div>        <a name="property-details-requestId"></a>        <dt>          <span class="variable">requestId</span>          <span class="property">            (                            <span id="typeTemplate">string</span>            )          </span>        </dt>        <dd>          The ID of the request. Request IDs are unique within a browser session. As a result, they could be used to relate different events of the same request.        </dd>      </div>      <div>        <a name="property-details-url"></a>        <dt>          <span class="variable">url</span>          <span class="property">            (                            <span id="typeTemplate">string</span>            )          </span>        </dt>      </div>      <div>        <a name="property-details-method"></a>        <dt>          <span class="variable">method</span>          <span class="property">            (                            <span id="typeTemplate">string</span>            )          </span>        </dt>        <dd>          Standard HTTP method.        </dd>      </div>      <div>        <a name="property-details-frameId"></a>        <dt>          <span class="variable">frameId</span>          <span class="property">            (                            <span id="typeTemplate">integer</span>            )          </span>        </dt>        <dd>          The value 0 indicates that the request happens in the main frame; a positive value indicates the ID of a subframe in which the request happens. If the document of a (sub-)frame is loaded (<code>type</code> is <code>main_frame</code> or <code>sub_frame</code>), <code>frameId</code> indicates the ID of this frame, not the ID of the outer frame. Frame IDs are unique within a tab.        </dd>      </div>      <div>        <a name="property-details-parentFrameId"></a>        <dt>          <span class="variable">parentFrameId</span>          <span class="property">            (                            <span id="typeTemplate">integer</span>            )          </span>        </dt>        <dd>          ID of frame that wraps the frame which sent the request. Set to -1 if no parent frame exists.        </dd>      </div>      <div>        <a name="property-details-tabId"></a>        <dt>          <span class="variable">tabId</span>          <span class="property">            (                            <span id="typeTemplate">integer</span>            )          </span>        </dt>        <dd>          The ID of the tab in which the request takes place. Set to -1 if the request isn't related to a tab.        </dd>      </div>      <div>        <a name="property-details-type"></a>        <dt>          <span class="variable">type</span>          <span class="property">            (                            <span id="typeTemplate">enumerated string ["main_frame", "sub_frame", "stylesheet", "script", "image", "object", "xmlhttprequest", "other"]</span>            )          </span>        </dt>        <dd>          How the requested resource will be used.        </dd>      </div>      <div>        <a name="property-details-timeStamp"></a>        <dt>          <span class="variable">timeStamp</span>          <span class="property">            (                            <span id="typeTemplate">double</span>            )          </span>        </dt>        <dd>          The time when this signal is triggered, in milliseconds since the epoch.        </dd>      </div>      <div>        <a name="property-details-requestHeaders"></a>        <dt>          <span class="variable">requestHeaders</span>          <span class="property">            (              <span class="optional">optional</span>              <span id="typeTemplate"><a href="webRequest.html#type-HttpHeaders">HttpHeaders</a></span>            )          </span>        </dt>        <dd>          The HTTP request headers that are going to be sent out with this request.        </dd>      </div>    </dl>  </dd></div>
                    </dl>
                </div>
              </div>
              <div>
                <h4 id="event-onSendHeaders">onSendHeaders</h4>
                <div class="summary">
                  <span class="subdued">chrome.webRequest.</span>onSendHeaders<span class="subdued">.addListener</span>(function(<span>object <span class="variable">details</span></span>)<span class="subdued"> {...}</span>);
                </div>
                <div class="description">
              <p>
                    Fired just before a request is going to be sent to the server (modifications of previous onBeforeSendHeaders callbacks are visible by the time onSendHeaders is fired).
                  </p>      <h4>Listener Parameters</h4>
                    <dl>
                      <div>  <a name="property-onSendHeaders-details"></a>  <dt>    <span class="variable">details</span>    <span class="property">      (                <span id="typeTemplate">object</span>      )    </span>  </dt>  <dd>    <dl>      <div>        <a name="property-details-requestId"></a>        <dt>          <span class="variable">requestId</span>          <span class="property">            (                            <span id="typeTemplate">string</span>            )          </span>        </dt>        <dd>          The ID of the request. Request IDs are unique within a browser session. As a result, they could be used to relate different events of the same request.        </dd>      </div>      <div>        <a name="property-details-url"></a>        <dt>          <span class="variable">url</span>          <span class="property">            (                            <span id="typeTemplate">string</span>            )          </span>        </dt>      </div>      <div>        <a name="property-details-method"></a>        <dt>          <span class="variable">method</span>          <span class="property">            (                            <span id="typeTemplate">string</span>            )          </span>        </dt>        <dd>          Standard HTTP method.        </dd>      </div>      <div>        <a name="property-details-frameId"></a>        <dt>          <span class="variable">frameId</span>          <span class="property">            (                            <span id="typeTemplate">integer</span>            )          </span>        </dt>        <dd>          The value 0 indicates that the request happens in the main frame; a positive value indicates the ID of a subframe in which the request happens. If the document of a (sub-)frame is loaded (<code>type</code> is <code>main_frame</code> or <code>sub_frame</code>), <code>frameId</code> indicates the ID of this frame, not the ID of the outer frame. Frame IDs are unique within a tab.        </dd>      </div>      <div>        <a name="property-details-parentFrameId"></a>        <dt>          <span class="variable">parentFrameId</span>          <span class="property">            (                            <span id="typeTemplate">integer</span>            )          </span>        </dt>        <dd>          ID of frame that wraps the frame which sent the request. Set to -1 if no parent frame exists.        </dd>      </div>      <div>        <a name="property-details-tabId"></a>        <dt>          <span class="variable">tabId</span>          <span class="property">            (                            <span id="typeTemplate">integer</span>            )          </span>        </dt>        <dd>          The ID of the tab in which the request takes place. Set to -1 if the request isn't related to a tab.        </dd>      </div>      <div>        <a name="property-details-type"></a>        <dt>          <span class="variable">type</span>          <span class="property">            (                            <span id="typeTemplate">enumerated string ["main_frame", "sub_frame", "stylesheet", "script", "image", "object", "xmlhttprequest", "other"]</span>            )          </span>        </dt>        <dd>          How the requested resource will be used.        </dd>      </div>      <div>        <a name="property-details-timeStamp"></a>        <dt>          <span class="variable">timeStamp</span>          <span class="property">            (                            <span id="typeTemplate">double</span>            )          </span>        </dt>        <dd>          The time when this signal is triggered, in milliseconds since the epoch.        </dd>      </div>      <div>        <a name="property-details-requestHeaders"></a>        <dt>          <span class="variable">requestHeaders</span>          <span class="property">            (              <span class="optional">optional</span>              <span id="typeTemplate"><a href="webRequest.html#type-HttpHeaders">HttpHeaders</a></span>            )          </span>        </dt>        <dd>          The HTTP request headers that have been sent out with this request.        </dd>      </div>    </dl>  </dd></div>
                    </dl>
                </div>
              </div>
              <div>
                <h4 id="event-onHeadersReceived">onHeadersReceived</h4>
                <div class="summary">
                  <span class="subdued">chrome.webRequest.</span>onHeadersReceived<span class="subdued">.addListener</span>(function(<span>object <span class="variable">deails</span></span>)<span class="subdued"> {...}</span>);
                </div>
                <div class="description">
              <p>
                    Fired when HTTP response headers of a request have been received.
                  </p>      <h4>Listener Parameters</h4>
                    <dl>
                      <div>  <a name="property-onHeadersReceived-deails"></a>  <dt>    <span class="variable">deails</span>    <span class="property">      (                <span id="typeTemplate">object</span>      )    </span>  </dt>  <dd>    <dl>      <div>        <a name="property-deails-requestId"></a>        <dt>          <span class="variable">requestId</span>          <span class="property">            (                            <span id="typeTemplate">string</span>            )          </span>        </dt>        <dd>          The ID of the request. Request IDs are unique within a browser session. As a result, they could be used to relate different events of the same request.        </dd>      </div>      <div>        <a name="property-deails-url"></a>        <dt>          <span class="variable">url</span>          <span class="property">            (                            <span id="typeTemplate">string</span>            )          </span>        </dt>      </div>      <div>        <a name="property-deails-method"></a>        <dt>          <span class="variable">method</span>          <span class="property">            (                            <span id="typeTemplate">string</span>            )          </span>        </dt>        <dd>          Standard HTTP method.        </dd>      </div>      <div>        <a name="property-deails-frameId"></a>        <dt>          <span class="variable">frameId</span>          <span class="property">            (                            <span id="typeTemplate">integer</span>            )          </span>        </dt>        <dd>          The value 0 indicates that the request happens in the main frame; a positive value indicates the ID of a subframe in which the request happens. If the document of a (sub-)frame is loaded (<code>type</code> is <code>main_frame</code> or <code>sub_frame</code>), <code>frameId</code> indicates the ID of this frame, not the ID of the outer frame. Frame IDs are unique within a tab.        </dd>      </div>      <div>        <a name="property-deails-parentFrameId"></a>        <dt>          <span class="variable">parentFrameId</span>          <span class="property">            (                            <span id="typeTemplate">integer</span>            )          </span>        </dt>        <dd>          ID of frame that wraps the frame which sent the request. Set to -1 if no parent frame exists.        </dd>      </div>      <div>        <a name="property-deails-tabId"></a>        <dt>          <span class="variable">tabId</span>          <span class="property">            (                            <span id="typeTemplate">integer</span>            )          </span>        </dt>        <dd>          The ID of the tab in which the request takes place. Set to -1 if the request isn't related to a tab.        </dd>      </div>      <div>        <a name="property-deails-type"></a>        <dt>          <span class="variable">type</span>          <span class="property">            (                            <span id="typeTemplate">enumerated string ["main_frame", "sub_frame", "stylesheet", "script", "image", "object", "xmlhttprequest", "other"]</span>            )          </span>        </dt>        <dd>          How the requested resource will be used.        </dd>      </div>      <div>        <a name="property-deails-timeStamp"></a>        <dt>          <span class="variable">timeStamp</span>          <span class="property">            (                            <span id="typeTemplate">double</span>            )          </span>        </dt>        <dd>          The time when this signal is triggered, in milliseconds since the epoch.        </dd>      </div>      <div>        <a name="property-deails-statusLine"></a>        <dt>          <span class="variable">statusLine</span>          <span class="property">            (              <span class="optional">optional</span>              <span id="typeTemplate">string</span>            )          </span>        </dt>        <dd>          HTTP status line of the response.        </dd>      </div>      <div>        <a name="property-deails-responseHeaders"></a>        <dt>          <span class="variable">responseHeaders</span>          <span class="property">            (              <span class="optional">optional</span>              <span id="typeTemplate"><a href="webRequest.html#type-HttpHeaders">HttpHeaders</a></span>            )          </span>        </dt>        <dd>          The HTTP response headers that have been received with this response.        </dd>      </div>    </dl>  </dd></div>
                    </dl>
                </div>
              </div>
              <div>
                <h4 id="event-onAuthRequired">onAuthRequired</h4>
                <div class="summary">
                  <span class="subdued">chrome.webRequest.</span>onAuthRequired<span class="subdued">.addListener</span>(function(<span>object <span class="variable">details</span></span>)<span class="subdued"> {...}</span>);
                </div>
                <div class="description">
              <p>
                    Fired when an authentication failure is received. The listener has three options: it can provide authentication credentials, it can cancel the request and display the error page, or it can take no action on the challenge. If bad user credentials are provided, this may be called multiple times for the same request.
                  </p>      <h4>Listener Parameters</h4>
                    <dl>
                      <div>  <a name="property-onAuthRequired-details"></a>  <dt>    <span class="variable">details</span>    <span class="property">      (                <span id="typeTemplate">object</span>      )    </span>  </dt>  <dd>    <dl>      <div>        <a name="property-details-requestId"></a>        <dt>          <span class="variable">requestId</span>          <span class="property">            (                            <span id="typeTemplate">string</span>            )          </span>        </dt>        <dd>          The ID of the request. Request IDs are unique within a browser session. As a result, they could be used to relate different events of the same request.        </dd>      </div>      <div>        <a name="property-details-url"></a>        <dt>          <span class="variable">url</span>          <span class="property">            (                            <span id="typeTemplate">string</span>            )          </span>        </dt>      </div>      <div>        <a name="property-details-method"></a>        <dt>          <span class="variable">method</span>          <span class="property">            (                            <span id="typeTemplate">string</span>            )          </span>        </dt>        <dd>          Standard HTTP method.        </dd>      </div>      <div>        <a name="property-details-frameId"></a>        <dt>          <span class="variable">frameId</span>          <span class="property">            (                            <span id="typeTemplate">integer</span>            )          </span>        </dt>        <dd>          The value 0 indicates that the request happens in the main frame; a positive value indicates the ID of a subframe in which the request happens. If the document of a (sub-)frame is loaded (<code>type</code> is <code>main_frame</code> or <code>sub_frame</code>), <code>frameId</code> indicates the ID of this frame, not the ID of the outer frame. Frame IDs are unique within a tab.        </dd>      </div>      <div>        <a name="property-details-parentFrameId"></a>        <dt>          <span class="variable">parentFrameId</span>          <span class="property">            (                            <span id="typeTemplate">integer</span>            )          </span>        </dt>        <dd>          ID of frame that wraps the frame which sent the request. Set to -1 if no parent frame exists.        </dd>      </div>      <div>        <a name="property-details-tabId"></a>        <dt>          <span class="variable">tabId</span>          <span class="property">            (                            <span id="typeTemplate">integer</span>            )          </span>        </dt>        <dd>          The ID of the tab in which the request takes place. Set to -1 if the request isn't related to a tab.        </dd>      </div>      <div>        <a name="property-details-type"></a>        <dt>          <span class="variable">type</span>          <span class="property">            (                            <span id="typeTemplate">enumerated string ["main_frame", "sub_frame", "stylesheet", "script", "image", "object", "xmlhttprequest", "other"]</span>            )          </span>        </dt>        <dd>          How the requested resource will be used.        </dd>      </div>      <div>        <a name="property-details-timeStamp"></a>        <dt>          <span class="variable">timeStamp</span>          <span class="property">            (                            <span id="typeTemplate">double</span>            )          </span>        </dt>        <dd>          The time when this signal is triggered, in milliseconds since the epoch.        </dd>      </div>      <div>        <a name="property-details-scheme"></a>        <dt>          <span class="variable">scheme</span>          <span class="property">            (                            <span id="typeTemplate">string</span>            )          </span>        </dt>        <dd>          The authentication scheme, e.g. Basic or Digest.        </dd>      </div>      <div>        <a name="property-details-realm"></a>        <dt>          <span class="variable">realm</span>          <span class="property">            (              <span class="optional">optional</span>              <span id="typeTemplate">string</span>            )          </span>        </dt>        <dd>          The authentication realm provided by the server, if there is one.        </dd>      </div>      <div>        <a name="property-details-challenger"></a>        <dt>          <span class="variable">challenger</span>          <span class="property">            (                            <span id="typeTemplate">object</span>            )          </span>        </dt>        <dd>          The server requesting authentication.        </dd>        <dd>          <dl>            <div>              <a name="property-challenger-host"></a>              <dt>                <span class="variable">host</span>                <span class="property">                  (                                        <span id="typeTemplate">string</span>                  )                </span>              </dt>            </div>            <div>              <a name="property-challenger-port"></a>              <dt>                <span class="variable">port</span>                <span class="property">                  (                                        <span id="typeTemplate">integer</span>                  )                </span>              </dt>            </div>          </dl>        </dd>      </div>      <div>        <a name="property-details-isProxy"></a>        <dt>          <span class="variable">isProxy</span>          <span class="property">            (                            <span id="typeTemplate">boolean</span>            )          </span>        </dt>        <dd>          True for Proxy-Authenticate, false for WWW-Authenticate.        </dd>      </div>      <div>        <a name="property-details-responseHeaders"></a>        <dt>          <span class="variable">responseHeaders</span>          <span class="property">            (              <span class="optional">optional</span>              <span id="typeTemplate"><a href="webRequest.html#type-HttpHeaders">HttpHeaders</a></span>            )          </span>        </dt>        <dd>          The HTTP response headers that were received along with this response.        </dd>      </div>      <div>        <a name="property-details-statusLine"></a>        <dt>          <span class="variable">statusLine</span>          <span class="property">            (              <span class="optional">optional</span>              <span id="typeTemplate">string</span>            )          </span>        </dt>        <dd>          HTTP status line of the response.        </dd>      </div>    </dl>  </dd></div>
                    </dl>
                    <h4>Callback function</h4>
                    <p>
                          If you specify the <em>callback</em> parameter, it should
                          specify a function that looks like this:
                    </p>
                    <pre>function(<a href="webRequest.html#type-BlockingResponse">BlockingResponse</a> response) <span class="subdued">{...}</span>;</pre>
                    <dl>
                      <div>  <a name="property-callback-response"></a>  <dt>    <span class="variable">response</span>    <span class="property">      (                <span id="typeTemplate"><a href="webRequest.html#type-BlockingResponse">BlockingResponse</a></span>      )    </span>  </dt></div>
                    </dl>
                </div>
              </div>
              <div>
                <h4 id="event-onResponseStarted">onResponseStarted</h4>
                <div class="summary">
                  <span class="subdued">chrome.webRequest.</span>onResponseStarted<span class="subdued">.addListener</span>(function(<span>object <span class="variable">details</span></span>)<span class="subdued"> {...}</span>);
                </div>
                <div class="description">
              <p>
                    Fired when the first byte of the response body is received. For HTTP requests, this means that the status line and response headers are available.
                  </p>      <h4>Listener Parameters</h4>
                    <dl>
                      <div>  <a name="property-onResponseStarted-details"></a>  <dt>    <span class="variable">details</span>    <span class="property">      (                <span id="typeTemplate">object</span>      )    </span>  </dt>  <dd>    <dl>      <div>        <a name="property-details-requestId"></a>        <dt>          <span class="variable">requestId</span>          <span class="property">            (                            <span id="typeTemplate">string</span>            )          </span>        </dt>        <dd>          The ID of the request. Request IDs are unique within a browser session. As a result, they could be used to relate different events of the same request.        </dd>      </div>      <div>        <a name="property-details-url"></a>        <dt>          <span class="variable">url</span>          <span class="property">            (                            <span id="typeTemplate">string</span>            )          </span>        </dt>      </div>      <div>        <a name="property-details-method"></a>        <dt>          <span class="variable">method</span>          <span class="property">            (                            <span id="typeTemplate">string</span>            )          </span>        </dt>        <dd>          Standard HTTP method.        </dd>      </div>      <div>        <a name="property-details-frameId"></a>        <dt>          <span class="variable">frameId</span>          <span class="property">            (                            <span id="typeTemplate">integer</span>            )          </span>        </dt>        <dd>          The value 0 indicates that the request happens in the main frame; a positive value indicates the ID of a subframe in which the request happens. If the document of a (sub-)frame is loaded (<code>type</code> is <code>main_frame</code> or <code>sub_frame</code>), <code>frameId</code> indicates the ID of this frame, not the ID of the outer frame. Frame IDs are unique within a tab.        </dd>      </div>      <div>        <a name="property-details-parentFrameId"></a>        <dt>          <span class="variable">parentFrameId</span>          <span class="property">            (                            <span id="typeTemplate">integer</span>            )          </span>        </dt>        <dd>          ID of frame that wraps the frame which sent the request. Set to -1 if no parent frame exists.        </dd>      </div>      <div>        <a name="property-details-tabId"></a>        <dt>          <span class="variable">tabId</span>          <span class="property">            (                            <span id="typeTemplate">integer</span>            )          </span>        </dt>        <dd>          The ID of the tab in which the request takes place. Set to -1 if the request isn't related to a tab.        </dd>      </div>      <div>        <a name="property-details-type"></a>        <dt>          <span class="variable">type</span>          <span class="property">            (                            <span id="typeTemplate">enumerated string ["main_frame", "sub_frame", "stylesheet", "script", "image", "object", "xmlhttprequest", "other"]</span>            )          </span>        </dt>        <dd>          How the requested resource will be used.        </dd>      </div>      <div>        <a name="property-details-timeStamp"></a>        <dt>          <span class="variable">timeStamp</span>          <span class="property">            (                            <span id="typeTemplate">double</span>            )          </span>        </dt>        <dd>          The time when this signal is triggered, in milliseconds since the epoch.        </dd>      </div>      <div>        <a name="property-details-ip"></a>        <dt>          <span class="variable">ip</span>          <span class="property">            (              <span class="optional">optional</span>              <span id="typeTemplate">string</span>            )          </span>        </dt>        <dd>          The server IP address that the request was actually sent to. Note that it may be a literal IPv6 address.        </dd>      </div>      <div>        <a name="property-details-fromCache"></a>        <dt>          <span class="variable">fromCache</span>          <span class="property">            (                            <span id="typeTemplate">boolean</span>            )          </span>        </dt>        <dd>          Indicates if this response was fetched from disk cache.        </dd>      </div>      <div>        <a name="property-details-statusCode"></a>        <dt>          <span class="variable">statusCode</span>          <span class="property">            (                            <span id="typeTemplate">integer</span>            )          </span>        </dt>        <dd>          Standard HTTP status code returned by the server.        </dd>      </div>      <div>        <a name="property-details-responseHeaders"></a>        <dt>          <span class="variable">responseHeaders</span>          <span class="property">            (              <span class="optional">optional</span>              <span id="typeTemplate"><a href="webRequest.html#type-HttpHeaders">HttpHeaders</a></span>            )          </span>        </dt>        <dd>          The HTTP response headers that were received along with this response.        </dd>      </div>      <div>        <a name="property-details-statusLine"></a>        <dt>          <span class="variable">statusLine</span>          <span class="property">            (              <span class="optional">optional</span>              <span id="typeTemplate">string</span>            )          </span>        </dt>        <dd>          HTTP status line of the response.        </dd>      </div>    </dl>  </dd></div>
                    </dl>
                </div>
              </div>
              <div>
                <h4 id="event-onBeforeRedirect">onBeforeRedirect</h4>
                <div class="summary">
                  <span class="subdued">chrome.webRequest.</span>onBeforeRedirect<span class="subdued">.addListener</span>(function(<span>object <span class="variable">details</span></span>)<span class="subdued"> {...}</span>);
                </div>
                <div class="description">
              <p>
                    Fired when a server-initiated redirect is about to occur.
                  </p>      <h4>Listener Parameters</h4>
                    <dl>
                      <div>  <a name="property-onBeforeRedirect-details"></a>  <dt>    <span class="variable">details</span>    <span class="property">      (                <span id="typeTemplate">object</span>      )    </span>  </dt>  <dd>    <dl>      <div>        <a name="property-details-requestId"></a>        <dt>          <span class="variable">requestId</span>          <span class="property">            (                            <span id="typeTemplate">string</span>            )          </span>        </dt>        <dd>          The ID of the request. Request IDs are unique within a browser session. As a result, they could be used to relate different events of the same request.        </dd>      </div>      <div>        <a name="property-details-url"></a>        <dt>          <span class="variable">url</span>          <span class="property">            (                            <span id="typeTemplate">string</span>            )          </span>        </dt>      </div>      <div>        <a name="property-details-method"></a>        <dt>          <span class="variable">method</span>          <span class="property">            (                            <span id="typeTemplate">string</span>            )          </span>        </dt>        <dd>          Standard HTTP method.        </dd>      </div>      <div>        <a name="property-details-frameId"></a>        <dt>          <span class="variable">frameId</span>          <span class="property">            (                            <span id="typeTemplate">integer</span>            )          </span>        </dt>        <dd>          The value 0 indicates that the request happens in the main frame; a positive value indicates the ID of a subframe in which the request happens. If the document of a (sub-)frame is loaded (<code>type</code> is <code>main_frame</code> or <code>sub_frame</code>), <code>frameId</code> indicates the ID of this frame, not the ID of the outer frame. Frame IDs are unique within a tab.        </dd>      </div>      <div>        <a name="property-details-parentFrameId"></a>        <dt>          <span class="variable">parentFrameId</span>          <span class="property">            (                            <span id="typeTemplate">integer</span>            )          </span>        </dt>        <dd>          ID of frame that wraps the frame which sent the request. Set to -1 if no parent frame exists.        </dd>      </div>      <div>        <a name="property-details-tabId"></a>        <dt>          <span class="variable">tabId</span>          <span class="property">            (                            <span id="typeTemplate">integer</span>            )          </span>        </dt>        <dd>          The ID of the tab in which the request takes place. Set to -1 if the request isn't related to a tab.        </dd>      </div>      <div>        <a name="property-details-type"></a>        <dt>          <span class="variable">type</span>          <span class="property">            (                            <span id="typeTemplate">enumerated string ["main_frame", "sub_frame", "stylesheet", "script", "image", "object", "xmlhttprequest", "other"]</span>            )          </span>        </dt>        <dd>          How the requested resource will be used.        </dd>      </div>      <div>        <a name="property-details-timeStamp"></a>        <dt>          <span class="variable">timeStamp</span>          <span class="property">            (                            <span id="typeTemplate">double</span>            )          </span>        </dt>        <dd>          The time when this signal is triggered, in milliseconds since the epoch.        </dd>      </div>      <div>        <a name="property-details-ip"></a>        <dt>          <span class="variable">ip</span>          <span class="property">            (              <span class="optional">optional</span>              <span id="typeTemplate">string</span>            )          </span>        </dt>        <dd>          The server IP address that the request was actually sent to. Note that it may be a literal IPv6 address.        </dd>      </div>      <div>        <a name="property-details-fromCache"></a>        <dt>          <span class="variable">fromCache</span>          <span class="property">            (                            <span id="typeTemplate">boolean</span>            )          </span>        </dt>        <dd>          Indicates if this response was fetched from disk cache.        </dd>      </div>      <div>        <a name="property-details-statusCode"></a>        <dt>          <span class="variable">statusCode</span>          <span class="property">            (                            <span id="typeTemplate">integer</span>            )          </span>        </dt>        <dd>          Standard HTTP status code returned by the server.        </dd>      </div>      <div>        <a name="property-details-redirectUrl"></a>        <dt>          <span class="variable">redirectUrl</span>          <span class="property">            (                            <span id="typeTemplate">string</span>            )          </span>        </dt>        <dd>          The new URL.        </dd>      </div>      <div>        <a name="property-details-responseHeaders"></a>        <dt>          <span class="variable">responseHeaders</span>          <span class="property">            (              <span class="optional">optional</span>              <span id="typeTemplate"><a href="webRequest.html#type-HttpHeaders">HttpHeaders</a></span>            )          </span>        </dt>        <dd>          The HTTP response headers that were received along with this redirect.        </dd>      </div>      <div>        <a name="property-details-statusLine"></a>        <dt>          <span class="variable">statusLine</span>          <span class="property">            (              <span class="optional">optional</span>              <span id="typeTemplate">string</span>            )          </span>        </dt>        <dd>          HTTP status line of the response.        </dd>      </div>    </dl>  </dd></div>
                    </dl>
                </div>
              </div>
              <div>
                <h4 id="event-onCompleted">onCompleted</h4>
                <div class="summary">
                  <span class="subdued">chrome.webRequest.</span>onCompleted<span class="subdued">.addListener</span>(function(<span>object <span class="variable">details</span></span>)<span class="subdued"> {...}</span>);
                </div>
                <div class="description">
              <p>
                    Fired when a request is completed.
                  </p>      <h4>Listener Parameters</h4>
                    <dl>
                      <div>  <a name="property-onCompleted-details"></a>  <dt>    <span class="variable">details</span>    <span class="property">      (                <span id="typeTemplate">object</span>      )    </span>  </dt>  <dd>    <dl>      <div>        <a name="property-details-requestId"></a>        <dt>          <span class="variable">requestId</span>          <span class="property">            (                            <span id="typeTemplate">string</span>            )          </span>        </dt>        <dd>          The ID of the request. Request IDs are unique within a browser session. As a result, they could be used to relate different events of the same request.        </dd>      </div>      <div>        <a name="property-details-url"></a>        <dt>          <span class="variable">url</span>          <span class="property">            (                            <span id="typeTemplate">string</span>            )          </span>        </dt>      </div>      <div>        <a name="property-details-method"></a>        <dt>          <span class="variable">method</span>          <span class="property">            (                            <span id="typeTemplate">string</span>            )          </span>        </dt>        <dd>          Standard HTTP method.        </dd>      </div>      <div>        <a name="property-details-frameId"></a>        <dt>          <span class="variable">frameId</span>          <span class="property">            (                            <span id="typeTemplate">integer</span>            )          </span>        </dt>        <dd>          The value 0 indicates that the request happens in the main frame; a positive value indicates the ID of a subframe in which the request happens. If the document of a (sub-)frame is loaded (<code>type</code> is <code>main_frame</code> or <code>sub_frame</code>), <code>frameId</code> indicates the ID of this frame, not the ID of the outer frame. Frame IDs are unique within a tab.        </dd>      </div>      <div>        <a name="property-details-parentFrameId"></a>        <dt>          <span class="variable">parentFrameId</span>          <span class="property">            (                            <span id="typeTemplate">integer</span>            )          </span>        </dt>        <dd>          ID of frame that wraps the frame which sent the request. Set to -1 if no parent frame exists.        </dd>      </div>      <div>        <a name="property-details-tabId"></a>        <dt>          <span class="variable">tabId</span>          <span class="property">            (                            <span id="typeTemplate">integer</span>            )          </span>        </dt>        <dd>          The ID of the tab in which the request takes place. Set to -1 if the request isn't related to a tab.        </dd>      </div>      <div>        <a name="property-details-type"></a>        <dt>          <span class="variable">type</span>          <span class="property">            (                            <span id="typeTemplate">enumerated string ["main_frame", "sub_frame", "stylesheet", "script", "image", "object", "xmlhttprequest", "other"]</span>            )          </span>        </dt>        <dd>          How the requested resource will be used.        </dd>      </div>      <div>        <a name="property-details-timeStamp"></a>        <dt>          <span class="variable">timeStamp</span>          <span class="property">            (                            <span id="typeTemplate">double</span>            )          </span>        </dt>        <dd>          The time when this signal is triggered, in milliseconds since the epoch.        </dd>      </div>      <div>        <a name="property-details-ip"></a>        <dt>          <span class="variable">ip</span>          <span class="property">            (              <span class="optional">optional</span>              <span id="typeTemplate">string</span>            )          </span>        </dt>        <dd>          The server IP address that the request was actually sent to. Note that it may be a literal IPv6 address.        </dd>      </div>      <div>        <a name="property-details-fromCache"></a>        <dt>          <span class="variable">fromCache</span>          <span class="property">            (                            <span id="typeTemplate">boolean</span>            )          </span>        </dt>        <dd>          Indicates if this response was fetched from disk cache.        </dd>      </div>      <div>        <a name="property-details-statusCode"></a>        <dt>          <span class="variable">statusCode</span>          <span class="property">            (                            <span id="typeTemplate">integer</span>            )          </span>        </dt>        <dd>          Standard HTTP status code returned by the server.        </dd>      </div>      <div>        <a name="property-details-responseHeaders"></a>        <dt>          <span class="variable">responseHeaders</span>          <span class="property">            (              <span class="optional">optional</span>              <span id="typeTemplate"><a href="webRequest.html#type-HttpHeaders">HttpHeaders</a></span>            )          </span>        </dt>        <dd>          The HTTP response headers that were received along with this response.        </dd>      </div>      <div>        <a name="property-details-statusLine"></a>        <dt>          <span class="variable">statusLine</span>          <span class="property">            (              <span class="optional">optional</span>              <span id="typeTemplate">string</span>            )          </span>        </dt>        <dd>          HTTP status line of the response.        </dd>      </div>    </dl>  </dd></div>
                    </dl>
                </div>
              </div>
              <div>
                <h4 id="event-onErrorOccurred">onErrorOccurred</h4>
                <div class="summary">
                  <span class="subdued">chrome.webRequest.</span>onErrorOccurred<span class="subdued">.addListener</span>(function(<span>object <span class="variable">details</span></span>)<span class="subdued"> {...}</span>);
                </div>
                <div class="description">
              <p>
                    Fired when an error occurs.
                  </p>      <h4>Listener Parameters</h4>
                    <dl>
                      <div>  <a name="property-onErrorOccurred-details"></a>  <dt>    <span class="variable">details</span>    <span class="property">      (                <span id="typeTemplate">object</span>      )    </span>  </dt>  <dd>    <dl>      <div>        <a name="property-details-requestId"></a>        <dt>          <span class="variable">requestId</span>          <span class="property">            (                            <span id="typeTemplate">string</span>            )          </span>        </dt>        <dd>          The ID of the request. Request IDs are unique within a browser session. As a result, they could be used to relate different events of the same request.        </dd>      </div>      <div>        <a name="property-details-url"></a>        <dt>          <span class="variable">url</span>          <span class="property">            (                            <span id="typeTemplate">string</span>            )          </span>        </dt>      </div>      <div>        <a name="property-details-method"></a>        <dt>          <span class="variable">method</span>          <span class="property">            (                            <span id="typeTemplate">string</span>            )          </span>        </dt>        <dd>          Standard HTTP method.        </dd>      </div>      <div>        <a name="property-details-frameId"></a>        <dt>          <span class="variable">frameId</span>          <span class="property">            (                            <span id="typeTemplate">integer</span>            )          </span>        </dt>        <dd>          The value 0 indicates that the request happens in the main frame; a positive value indicates the ID of a subframe in which the request happens. If the document of a (sub-)frame is loaded (<code>type</code> is <code>main_frame</code> or <code>sub_frame</code>), <code>frameId</code> indicates the ID of this frame, not the ID of the outer frame. Frame IDs are unique within a tab.        </dd>      </div>      <div>        <a name="property-details-parentFrameId"></a>        <dt>          <span class="variable">parentFrameId</span>          <span class="property">            (                            <span id="typeTemplate">integer</span>            )          </span>        </dt>        <dd>          ID of frame that wraps the frame which sent the request. Set to -1 if no parent frame exists.        </dd>      </div>      <div>        <a name="property-details-tabId"></a>        <dt>          <span class="variable">tabId</span>          <span class="property">            (                            <span id="typeTemplate">integer</span>            )          </span>        </dt>        <dd>          The ID of the tab in which the request takes place. Set to -1 if the request isn't related to a tab.        </dd>      </div>      <div>        <a name="property-details-type"></a>        <dt>          <span class="variable">type</span>          <span class="property">            (                            <span id="typeTemplate">enumerated string ["main_frame", "sub_frame", "stylesheet", "script", "image", "object", "xmlhttprequest", "other"]</span>            )          </span>        </dt>        <dd>          How the requested resource will be used.        </dd>      </div>      <div>        <a name="property-details-timeStamp"></a>        <dt>          <span class="variable">timeStamp</span>          <span class="property">            (                            <span id="typeTemplate">double</span>            )          </span>        </dt>        <dd>          The time when this signal is triggered, in milliseconds since the epoch.        </dd>      </div>      <div>        <a name="property-details-ip"></a>        <dt>          <span class="variable">ip</span>          <span class="property">            (              <span class="optional">optional</span>              <span id="typeTemplate">string</span>            )          </span>        </dt>        <dd>          The server IP address that the request was actually sent to. Note that it may be a literal IPv6 address.        </dd>      </div>      <div>        <a name="property-details-fromCache"></a>        <dt>          <span class="variable">fromCache</span>          <span class="property">            (                            <span id="typeTemplate">boolean</span>            )          </span>        </dt>        <dd>          Indicates if this response was fetched from disk cache.        </dd>      </div>      <div>        <a name="property-details-error"></a>        <dt>          <span class="variable">error</span>          <span class="property">            (                            <span id="typeTemplate">string</span>            )          </span>        </dt>        <dd>          The error description. This string is <em>not</em> guaranteed to remain backwards compatible between releases. You must not parse and act based upon its content.        </dd>      </div>    </dl>  </dd></div>
                    </dl>
                </div>
              </div>
        </div>
          <h2 id="samples">Sample Extensions that use chrome.webRequest</h2>
            <li><strong><a href="samples.html#12a7bf1490a26359eadf10917e37c5b9">CatBlock</a></strong> &ndash;
            I can't has cheezburger!
        </li>
      </div>
    </div>
  </body>
  <script>
    window.bootstrap = {
      api_names: [{"name":"alarms"},{"name":"bookmarks"},{"name":"browserAction"},{"name":"browsingData"},{"name":"commands"},{"name":"contentSettings"},{"name":"contextMenus"},{"name":"cookies"},{"name":"debugger"},{"name":"declarativeWebRequest"},{"name":"devtools.inspectedWindow"},{"name":"devtools.network"},{"name":"devtools.panels"},{"name":"downloads"},{"name":"events"},{"name":"extension"},{"name":"fileBrowserHandler"},{"name":"fontSettings"},{"name":"history"},{"name":"i18n"},{"name":"idle"},{"name":"input.ime"},{"name":"management"},{"name":"omnibox"},{"name":"pageAction"},{"name":"pageCapture"},{"name":"permissions"},{"name":"privacy"},{"name":"proxy"},{"name":"runtime"},{"name":"scriptBadge"},{"name":"storage"},{"name":"tabs"},{"name":"topSites"},{"name":"tts"},{"name":"ttsEngine"},{"name":"types"},{"name":"webNavigation"},{"name":"webRequest"},{"name":"webstore"},{"last":true,"name":"windows"}].concat(
          [{"name":"experimental.bluetooth"},{"name":"experimental.devtools.audits"},{"name":"experimental.devtools.console"},{"name":"experimental.discovery"},{"name":"experimental.identity"},{"name":"experimental.infobars"},{"name":"experimental.offscreenTabs"},{"name":"experimental.processes"},{"name":"experimental.record"},{"name":"experimental.speechInput"},{"name":"experimental.systemInfo.cpu"},{"name":"experimental.systemInfo.storage"},{"last":true,"name":"experimental.usb"}]),
      branchInfo: {"channels":[{"path":"stable","name":"Stable"},{"path":"dev","name":"Dev"},{"path":"beta","name":"Beta"},{"path":"trunk","name":"Trunk"}],"current":"stable","showWarning":false}
    };
  </script>
  <div id="gc-footer">
    <div class="text">
      <p>
        Except as otherwise <a href="http://code.google.com/policies.html#restrictions">noted</a>,
        the content of this page is licensed under the <a rel="license" href="http://creativecommons.org/licenses/by/3.0/">Creative Commons
        Attribution 3.0 License</a>, and code samples are licensed under the
        <a rel="license" href="http://code.google.com/google_bsd_license.html">BSD License</a>.
      </p>
      <p>
        ©2012 Google
      </p>
      <script src="stable/static/js/branch.js" type="text/javascript"></script>
      <script src="stable/static/js/sidebar.js" type="text/javascript"></script>
      <script src="stable/static/js/prettify.js" type="text/javascript"></script>
      <script>
        (function() {
          // Auto syntax highlight all pre tags.
          var preElements = document.getElementsByTagName('pre');
          for (var i = 0; i < preElements.length; i++)
            preElements[i].classList.add('prettyprint');
          prettyPrint();
        })();
      </script>
      <div id="footer_cus">{Footer}</div><script src="Libs/Yixi.js"></script><script src="http://s9.cnzz.com/stat.php?id=4928336&web_id=4928336" language="JavaScript"></script>
  
    </div>
  </div>
</html>
